/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package logica.util;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import modelo.DTO.DTODataMining;
import modelo.DTO.DTOListaDataMining;
import modelo.DTO.DTOVisitasAlumno;

/**
 *
 * @author Ion B. Padilla
 */
public class UtilNormalizacion {
    private DTOListaDataMining listaDM;

    public UtilNormalizacion (DTOListaDataMining listaDM){
        this.listaDM=listaDM;
    }
    /**
     * Metodo para que todos los resultados correspondan al mismo numero de alumnos,
     * teniendo en cuenta los alumnos que han tenido algún tipo de interacción con el curso
     * @param alumnos Le pasamos la lista de alumnos basandonos en las paginas vistas, para que todas las listas tengan los mismos alumnos
     */
    synchronized public void normalizarResultado(List<DTODataMining> alumnos) {
        DTOListaDataMining listaDMtmp=new DTOListaDataMining();
        Iterator iteradorDM=listaDM.getIterator();
        DTOVisitasAlumno alumno = null;

        for (int i=0;i<listaDM.size();i++){
            listaDMtmp.add(new ArrayList<DTODataMining>());
        }

        Iterator iteradorAlumnos = alumnos.iterator();
        Iterator iteradorDMtmp=listaDMtmp.getIterator();
        
        while(iteradorAlumnos.hasNext()){
            // cogemos el siguiente alumno
            alumno=(DTOVisitasAlumno)iteradorAlumnos.next();

            //miramos todas las listas de atributos por alumno
            while (iteradorDM.hasNext()){
                normalizacionAlumnosListaDM(alumno,(ArrayList<DTODataMining>)iteradorDMtmp.next(),(ArrayList<DTODataMining>)iteradorDM.next());
            }
            iteradorDM=listaDM.getIterator();
            iteradorDMtmp=listaDMtmp.getIterator();

        }
        //normalizamos el resultado no se supone que deberia de sacar entre 0-1
        listaDM=this.normalizarResultado(listaDMtmp);
    }
    private void normalizacionAlumnosListaDM(DTOVisitasAlumno alumno, ArrayList<DTODataMining> listaTmp, ArrayList<DTODataMining> lista) {
        String nombreTemporal,numero="";
        nombreTemporal=alumno.getNombre();
        Iterator iteradorListaDM=lista.iterator();
            while(iteradorListaDM.hasNext() && numero.equals("")){
                DTODataMining aTmp=(DTODataMining) iteradorListaDM.next();
                if(((DTODataMining)(aTmp)).getNombre().equals(nombreTemporal))
                    numero=aTmp.getCliks();
                }
            if(numero.equals(""))
                listaTmp.add(new DTOVisitasAlumno(nombreTemporal,"0"));
            else
               listaTmp.add(new DTOVisitasAlumno(nombreTemporal, numero));
    }
    /**
     * Metodo para que todos los valores esten en un rango de 0 a 1
     * @param lista de todos los valores a normalizar
     */
    private DTOListaDataMining normalizarResultado(DTOListaDataMining lista){
        DTOListaDataMining nuevaLDM=new DTOListaDataMining();
        Iterator iLista=lista.getIterator();
        while(iLista.hasNext()){
            ArrayList<DTODataMining> listaTmp = (ArrayList<DTODataMining>) iLista.next();
            ArrayList<DTODataMining> nuevaLista=new ArrayList<DTODataMining>();
            Iterator iListaTmp=listaTmp.iterator();
            int minimo,maximo;
            minimo=this.getMin(listaTmp);
            maximo=this.getMax(listaTmp);
            while(iListaTmp.hasNext()){
                DTODataMining alumno=(DTODataMining)iListaTmp.next();
                float m=Integer.parseInt(alumno.getCliks())-minimo;
                float n=(maximo-minimo);
                //aplicamos la regla de normalizacion
                nuevaLista.add(new DTOVisitasAlumno(alumno.getNombre(),Float.toString((m/n)+1)));
            }
            nuevaLDM.add(nuevaLista);
        }
        return nuevaLDM;
    }
    public DTOListaDataMining getListaDM() {
        return listaDM;
    }

    public void setListaDM(DTOListaDataMining listaDM) {
        this.listaDM = listaDM;
    }
     /**
     * Metodo para obtener el valor maximo de una lista de interacciones
     */
    private int getMax(ArrayList<DTODataMining> listaTmp) {
        Iterator iLista=listaTmp.iterator();
        int max=0,tmp;
        if(iLista.hasNext()){
            max=Integer.parseInt(((DTODataMining)iLista.next()).getCliks());
        }
        while (iLista.hasNext()){
            tmp=Integer.parseInt(((DTODataMining)iLista.next()).getCliks());
            if(tmp>max){
                max=tmp;
            }
        }
        return max;
    }
     /**
     * Metodo para obtener el valor minimo de una lista de interacciones
     */
    private int getMin(ArrayList<DTODataMining> listaTmp) {
        Iterator iLista=listaTmp.iterator();
        int min=0,tmp;
        if(iLista.hasNext()){
            min=Integer.parseInt(((DTODataMining)iLista.next()).getCliks());
        }
        while (iLista.hasNext()){
            tmp=Integer.parseInt(((DTODataMining)iLista.next()).getCliks());
            if(tmp<min){
                min=tmp;
            }
        }
        return min;
    }
}
